#include <graphics.h>
#include <math.h>
#include <time.h>

#define WIDTH		1024		// 屏幕宽
#define HEIGHT		768			// 屏幕高
#define NUM_MOVERS	800			// 小球数量

// 定义小球结构
struct Mover
{
	COLORREF	color;		// 颜色
	float		x, 	y;			// 坐标
	float		vX,	vY;			// 速度
	float       radius;       // 半径
};

// 定义全局变量
Mover	movers[NUM_MOVERS];		// 小球数组

void startup()
{
	// 设置随机种子
	srand((unsigned int)time(NULL));

	// 初始化小球数组
	for (int i = 0; i < NUM_MOVERS; i++)
	{
		movers[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
		movers[i].x   = rand()%WIDTH;
		movers[i].y   = rand()%HEIGHT;
		movers[i].vX  = float(cos(float(i))) * (rand() % 34);
		movers[i].vY  = float(sin(float(i))) * (rand() % 34);
		movers[i].radius  = (rand() % 34)/15.0;
	}
	initgraph(WIDTH, HEIGHT);
	BeginBatchDraw();
}

void show()
{
	clearrectangle(0,0,WIDTH-1,HEIGHT - 1);	// 清空画面全部矩形区域
	for(int i = 0; i < NUM_MOVERS; i++)
	{
		// 画小球
		setcolor(movers[i].color);
		setfillstyle(movers[i].color);
		fillcircle(int(movers[i].x + 0.5), int(movers[i].y + 0.5), int(movers[i].radius + 0.5));  // 四舍五入
	}	
	FlushBatchDraw();
	Sleep(2);
}

void updateWithoutInput()
{
	for(int i = 0; i < NUM_MOVERS; i++)  // 对所有小球遍历
	{
		float x  = movers[i].x;  // 当前小球坐标
		float y  = movers[i].y;
		float vX = movers[i].vX;  // 当前小球速度
		float vY = movers[i].vY;

		// 根据位置+速度，更新小球的坐标
		float nextX = x + vX;
		float nextY = y + vY;

		// 小球如果超过上下左右四个边界的话，位置设为边界处，速度反向
		if	(nextX > WIDTH)	
		{ 
			nextX = WIDTH;	
			vX = -1*vX; 
		}
		else if (nextX < 0)	
		{
			nextX = 0;		
			vX = -1*vX; 
		}
		if	(nextY > HEIGHT)
		{ 
			nextY = HEIGHT;	
			vY = -1*vY; 
		}
		else if (nextY < 0)	
		{ 
			nextY = 0;		
			vY = -1*vY; 		
		}

		// 更新小球位置、速度的结构体数组
		movers[i].vX = vX;
		movers[i].vY = vY;
		movers[i].x  = nextX;
		movers[i].y  = nextY;
	}
}


void updateWithInput()
{
}
void gameover()
{
	EndBatchDraw();
	closegraph();
}

int main()
{
	startup();  // 数据初始化	
	while (1)  //  游戏循环执行
	{
		show();  // 显示画面
		updateWithoutInput();  // 与用户输入无关的更新
		updateWithInput();     // 与用户输入有关的更新
	}
	gameover();     // 游戏结束、后续处理
	return 0;
}
